home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol309 / jdutil.arc / ASM.ARC / PRINTDD.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-08-13  |  3.7 KB  |  115 lines

  1. ;       This is a modified version of a routine from SDIR Version
  2. ;       2.4, by Ted Reuss (modified from a program by John Chapman), on
  3. ;       PC-SIG Volume 185.
  4.  
  5.         .XLIST
  6.         INCLUDE ASCII.DEF
  7.         INCLUDE MSDOS2.DEF
  8.         .LIST
  9.  
  10. PUBLIC  PRINTDD
  11.  
  12. CODE    SEGMENT BYTE PUBLIC
  13.         ASSUME  CS:CODE
  14.         SUBTTL  PRINTDD - PRINT A DOUBLE WORD IN DI:SI
  15.         PAGE
  16. LDZERO: DB      1 DUP (?)
  17. DOUBLE: DB      8 DUP (20H)
  18.         DB      '$'
  19. DBLCNT: DW      1 DUP (?)
  20.  
  21. PRINTDD PROC    NEAR            ;Prints a 32 bit integer in DI:SI
  22.                                 ;AL = 0 to suppress leading 0's
  23.                 ;   = "0" (60Q) to print leading 0's
  24.                 ;   = " " (20Q) to print leading spaces
  25.         PUSH    DS
  26.         PUSH    AX
  27.         MOV     AX,CODE
  28.         MOV     DS,AX           ;MAKE DATA SEG POINT TO CODE
  29.         POP     AX
  30.         MOV     BYTE PTR CODE:LDZERO,AL
  31.         CALL    PRINTDX         ;format the double word into DOUBLE     2.4
  32.         MOV     DX,OFFSET CODE:DOUBLE
  33.         MOV     BX,DX
  34.         MOV     CX,7            ;SUPPRESS LEADING 0'S
  35. SUPP0:  MOV     AL,[BX]
  36.         CMP     AL,SPACE
  37.         JNE     SPDONE
  38.         MOV     AL,BYTE PTR CODE:LDZERO
  39.     CMP    AL,0
  40.     JNE    SUPP1
  41.     INC    DX
  42.     JMP    SHORT SUPP2
  43. SUPP1:
  44.         MOV     [BX],AL
  45. SUPP2:
  46.         INC     BX
  47.         LOOP    SUPP0
  48. SPDONE:
  49.         MOV     AH,CON_STRING_OUTPUT
  50.         INT     DOS             ;print the digits                       2.4
  51.         POP     DS              ;RESTORE DATA SEG
  52.         RET                     ;and return                             2.4
  53. PRINTDD ENDP                    ;                                       2.4
  54.  
  55. PRINTDX PROC    NEAR            ;converts integer in DI:SI to decimal   2.4
  56.         MOV     WORD PTR CODE:DBLCNT,0   ;reset the offset for DOUBLE   2.4
  57.         XOR     AX,AX           ;Zero out the                           2.4
  58.         MOV     BX,AX           ; working
  59.         MOV     BP,AX           ; registers.
  60.         MOV     CX,32           ;# bits of precision
  61. J1:     SHL     SI,1
  62.         RCL     DI,1
  63.         XCHG    BP,AX
  64.         CALL    J6
  65.         XCHG    BP,AX
  66.         XCHG    BX,AX
  67.         CALL    J6
  68.         XCHG    BX,AX
  69.         ADC     AL,0
  70.         LOOP    J1
  71.         MOV     CX,1710H        ;5904 ?
  72.         MOV     AX,BX
  73.         CALL    J2
  74.         MOV     AX,BP
  75. J2:     PUSH    AX
  76.         MOV     DL,AH
  77.         CALL    J3
  78.         POP     DX
  79. J3:     MOV     DH,DL
  80.         SHR     DL,1            ;Move high
  81.         SHR     DL,1            ; nibble to
  82.         SHR     DL,1            ; the low
  83.         SHR     DL,1            ; position.
  84.         CALL    J4
  85.         MOV     DL,DH
  86. J4:     AND     DL,0FH          ;Mask low nibble
  87.         JZ      J5              ;If not zero
  88.         MOV     CL,0
  89. J5:     DEC     CH
  90.         AND     CL,CH
  91.         OR      DL,'0'          ;Fold in ASCII zero
  92.         SUB     DL,CL
  93.         PUSH    DI              ;save DI                                2.4
  94.         MOV     DI,OFFSET CODE:DOUBLE ;point to DOUBLE                  2.4
  95.         ADD     DI,WORD PTR CODE:DBLCNT  ;add current offset            2.4
  96.         INC     WORD PTR CODE:DBLCNT  ;bump offset for next time        2.4
  97.         MOV     BYTE PTR DS:[DI],DL ;move next digit to DOUBLE          2.4
  98.         POP     DI              ;restore DI                             2.4
  99.         RET                     ;Exit to caller
  100. PRINTDX ENDP                    ;                                       2.4
  101.  
  102. J6      PROC    NEAR
  103.         ADC     AL,AL
  104.         DAA
  105.         XCHG    AL,AH
  106.         ADC     AL,AL
  107.         DAA
  108.         XCHG    AL,AH
  109.         RET
  110. J6      ENDP
  111.  
  112. CODE    ENDS
  113.         END
  114.  
  115.